package Class;

/**
 * @author 王艺锡
 * @version 1.0
 */
public class ClassLoad {
    //1.静态加载:编译时加载相关的类，如果没有则报错，依赖性太强
    //2.动态加载:运行时加载需要的类，如果运行时不用该类，即使不存在该类，也不会报错，降低了依赖性

    //类加载的时机
    //1.当创建对象时(new)        ->静态加载
    //2.当子类被加载时，父类也加载  ->静态加载
    //3.调用类中的静态成员时       ->静态加载
    //4.通过反射                ->动态加载


    //类加载的三个阶段
    //1.加载:
    //在此阶段，JVM将字节码从不同的数据源转化为二进制字节流加载到内存中，并生成一个代表该类的class对象

    // 2.连接(1.验证  2.准备 3.解析)
    //JVM会在该阶段的准备阶段中，对静态变量分配内存并默认初始化


    // 3.初始化:
    //初始化阶段，会执行<clinit>()方法，此方法有编译器按语句在原文中出现的顺序，
    // 依次自动收集类中所有静态变量的赋值动作和静态代码块中的语句，进行合并
    //虚拟机也会保证一个类的<clinit>()方法在多线程的环境中被正确的加锁，同步，来保证一个类只会有一个class类对象+
}